package bavaria.hightech.banking;

import bavaria.hightech.exceptions.NichtGenugGeldException;

public class BankImpl implements BankKundenSicht {
	
	private Festgeldkonto[] festgeldKonten;
	private Girokonto[] giroKonten;
	private int festgeldKontenCounter;
	private int giroKontenCounter;
	private double zinsGiro;
	private double zinsFestgeld;
	
	
	public BankImpl(double zinsGiro, double zinsFestgeld) {
		festgeldKonten = new Festgeldkonto[1000];
		festgeldKontenCounter = 0;
		giroKonten = new Girokonto[1000];
		giroKontenCounter = 0;
		this.zinsGiro = zinsGiro;
		this.zinsFestgeld = zinsFestgeld;
	}

	@Override
	public void giroKontoAnlegen(String name) {
		giroKonten[giroKontenCounter] = new Girokonto(100000 + giroKontenCounter, name, zinsGiro);
		giroKontenCounter++;
		
	}

	@Override
	public void festgeldKontoAnlegen(String name) {
		festgeldKonten[festgeldKontenCounter] = new Festgeldkonto(1000 + festgeldKontenCounter, name, zinsFestgeld);
		festgeldKontenCounter++;
	}

	@Override
	public double getKontostand(int kontonummer) {	
		return getKonto(kontonummer).getKontostand();
	}
	
	@Override
	public void einzahlen(double betrag, int kontonummer) {
		Konto konto = getKonto(kontonummer);
		konto.zugang(betrag, "Einzahlung");	
	}

	@Override
	public void auszahlen(double betrag, int kontonummer) throws NichtGenugGeldException {
		Konto konto = getKonto(kontonummer);
		if(konto instanceof Festgeldkonto && konto.getKontostand()-betrag < 0){
			throw new NichtGenugGeldException("Auszahlung ungueltig, da nicht genug Geld auf dem Festgeldkonto!");
		}
		konto.abgang(betrag, "Auszahlung");	
	}

	@Override
	public void ueberweisen(double betrag, int kontonummerInhaber,
			int kontonummerEmpfaenger) throws NichtGenugGeldException {
		Konto kontoInhaber = getKonto(kontonummerInhaber);
		Konto kontoEmpfaenger = getKonto(kontonummerEmpfaenger);
		if(kontoInhaber instanceof Festgeldkonto && kontoInhaber.getKontostand()-betrag < 0){
			throw new NichtGenugGeldException("Ueberweisung ungueltig, da nicht genug Geld auf dem Festgeldkonto!");
		}
		kontoInhaber.abgang(betrag, "Ueberweisung");
		kontoEmpfaenger.zugang(betrag, "Ueberweisung");
		
	}

	
	
	private Konto getKonto(int kontonummer){
		Konto konto = null;
		for (Konto festgeldKonto : festgeldKonten) {
			if(festgeldKonto != null && festgeldKonto.getKontonummer() == kontonummer){
				konto = festgeldKonto;
		    }
		}
		for (Konto giroKonto : giroKonten) {
			if(giroKonto != null && giroKonto.getKontonummer() == kontonummer){
				konto = giroKonto;
			}
		}
		if(konto == null){
			System.out.println("Konto existiert nicht!");
		}
		return konto;
	}
	
	public void verzinsen(){
		for (Konto festgeldKonto : festgeldKonten) {
			if(festgeldKonto != null){
				festgeldKonto.verzinsen();
			}			
		}
		for (Konto giroKonto : giroKonten) {
			if(giroKonto != null){
				giroKonto.verzinsen();
			}			
		}
	}
	
	public void list(){
		System.out.println("Kontoinhaber::Kontonummer::Kontostand");
		System.out.println("-------------------------------------");
		for (Konto festgeldKonto : festgeldKonten) {
			if(festgeldKonto != null){
			System.out.println(festgeldKonto.toString());
			}
		}
		for (Konto giroKonto : giroKonten) {
			if(giroKonto != null){
			System.out.println(giroKonto.toString());
			}
		}
	}







	
	

	
}
